package com.cencat.framework.security.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 安全配置属性
 */
@Data
@Component
@ConfigurationProperties(prefix = "cencat.security")
public class SecurityProperties {
    
    /**
     * JWT配置
     */
    private Jwt jwt = new Jwt();
    
    /**
     * 认证配置
     */
    private Auth auth = new Auth();
    
    /**
     * 密码配置
     */
    private Password password = new Password();
    
    /**
     * 会话配置
     */
    private Session session = new Session();
    
    /**
     * JWT配置类
     */
    @Data
    public static class Jwt {
        /**
         * JWT密钥
         */
        private String secret = "defaultSecretKeyForJWTTokenGenerationInCencatFramework";
        
        /**
         * JWT过期时间（秒）
         */
        private Long expiration = 7200L;
        
        /**
         * JWT令牌前缀
         */
        private String tokenPrefix = "Bearer ";
        
        /**
         * JWT请求头名称
         */
        private String header = "Authorization";
        
        /**
         * 令牌刷新时间（秒）
         */
        private Long refreshTime = 300L;
    }
    
    /**
     * 认证配置类
     */
    @Data
    public static class Auth {
        /**
         * 是否启用认证
         */
        private Boolean enabled = true;
        
        /**
         * 最大登录失败次数
         */
        private Integer maxLoginAttempts = 5;
        
        /**
         * 登录失败锁定时间（分钟）
         */
        private Integer lockTime = 30;
        
        /**
         * 是否启用验证码
         */
        private Boolean captchaEnabled = true;
        
        /**
         * 验证码类型
         */
        private String captchaType = "math";
        
        /**
         * 验证码宽度
         */
        private Integer captchaWidth = 120;
        
        /**
         * 验证码高度
         */
        private Integer captchaHeight = 40;
        
        /**
         * 验证码长度
         */
        private Integer captchaLength = 4;
        
        /**
         * 验证码过期时间（秒）
         */
        private Integer captchaExpire = 300;
    }
    
    /**
     * 密码配置类
     */
    @Data
    public static class Password {
        /**
         * 密码最小长度
         */
        private Integer minLength = 6;
        
        /**
         * 密码最大长度
         */
        private Integer maxLength = 100;
        
        /**
         * 密码强度等级
         */
        private Integer strengthLevel = 2;
        
        /**
         * 密码过期时间（天）
         */
        private Integer expireDays = 90;
        
        /**
         * 密码历史记录数
         */
        private Integer historyCount = 5;
        
        /**
         * 是否启用密码复杂度检查
         */
        private Boolean complexityCheck = true;
        
        /**
         * 是否启用密码过期提醒
         */
        private Boolean expireReminder = true;
    }
    
    /**
     * 会话配置类
     */
    @Data
    public static class Session {
        /**
         * 会话超时时间（秒）
         */
        private Integer timeout = 1800;
        
        /**
         * 最大会话数
         */
        private Integer maximumSessions = 1;
        
        /**
         * 是否允许并发登录
         */
        private Boolean concurrentLogin = false;
        
        /**
         * 会话存储类型
         */
        private String storageType = "redis";
        
        /**
         * 会话清理间隔（秒）
         */
        private Integer cleanupInterval = 300;
    }
    
    /**
     * 获取JWT密钥
     */
    public String getJwtSecret() {
        return jwt.getSecret();
    }
    
    /**
     * 获取JWT过期时间
     */
    public Long getJwtExpiration() {
        return jwt.getExpiration();
    }
    
    /**
     * 获取JWT令牌前缀
     */
    public String getJwtTokenPrefix() {
        return jwt.getTokenPrefix();
    }
    
    /**
     * 获取JWT请求头名称
     */
    public String getJwtHeader() {
        return jwt.getHeader();
    }
    
    /**
     * 获取令牌刷新时间
     */
    public Long getJwtRefreshTime() {
        return jwt.getRefreshTime();
    }
    
    /**
     * 是否启用认证
     */
    public Boolean isAuthEnabled() {
        return auth.getEnabled();
    }
    
    /**
     * 获取最大登录失败次数
     */
    public Integer getMaxLoginAttempts() {
        return auth.getMaxLoginAttempts();
    }
    
    /**
     * 获取登录失败锁定时间
     */
    public Integer getLockTime() {
        return auth.getLockTime();
    }
    
    /**
     * 是否启用验证码
     */
    public Boolean isCaptchaEnabled() {
        return auth.getCaptchaEnabled();
    }
    
    /**
     * 获取密码最小长度
     */
    public Integer getPasswordMinLength() {
        return password.getMinLength();
    }
    
    /**
     * 获取密码最大长度
     */
    public Integer getPasswordMaxLength() {
        return password.getMaxLength();
    }
    
    /**
     * 获取会话超时时间
     */
    public Integer getSessionTimeout() {
        return session.getTimeout();
    }
}